package guardFinderWS;

import helpers.operacionesBD;
import helpers.emailer;
import entidades.ubicacionGuarda;
import entidades.ubicaciones;
import entidades.listaImplicados;
import entidades.eventos;
import java.util.ArrayList;
import com.google.gson.*;
import entidades.guarda;
import entidades.informeCheckins;
import entidades.informeGuarda;
import entidades.informeReportes;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.util.Collection;
import javax.imageio.ImageIO;

/**
 *
 * @author Marco
 */
public class operaciones {

    operacionesBD operacionesBD;
    ArrayList<eventos> listaEventos;

    public operaciones() {

        this.operacionesBD = new operacionesBD();

    }

    public String crearEventos(String evento) {

        String valorRetorno = "{\"valores\":";

        valorRetorno += "\"" + operacionesBD.crearEvento(evento) + "\"}";

        return valorRetorno;

    }

    public String obtenerEventos() {

        String valorRetorno = "{\"valores\":[";
        try {
            listaEventos = operacionesBD.obtenerEventos();


            if (listaEventos.isEmpty()) {
                valorRetorno += "{\"id\":-1,\"valor\":\"No hay eventos\"}";

            } else {
                valorRetorno += "";


                for (eventos u : listaEventos) {
                    valorRetorno += u.toString() + ",";
                }

                valorRetorno = valorRetorno.substring(0, valorRetorno.length() - 1);

            }
        } catch (Exception e) {

            valorRetorno += "{\"id\":-1,\"valor\":\"Ha ocurrido un error: " + e.getLocalizedMessage() + "\"}";

        }

        valorRetorno += "]}";
        return valorRetorno;

    }

    public String iniciarSesion(String usuario, String clave) {

        String valorRetorno = "{\"valores\":";

        valorRetorno += "\"" + operacionesBD.iniciarSesion(usuario, clave) + "\"}";

        return valorRetorno;
    }

    public String crearUsuario(String usuario, String clave, String nombre, String apellidos) {

        String valorRetorno = "{\"valores\":";

        valorRetorno += "\"" + operacionesBD.crearUsuario(usuario, clave, nombre, apellidos) + "\"}";


        return valorRetorno;

    }

    String obtenerUbicacion(String latitud, String longitud) {
        String valorRetorno = "{\"valores\":[";
        try {
            ArrayList<ubicaciones> listaUbicaciones = operacionesBD.obtenerUbicacion(latitud, longitud);

            if (listaUbicaciones.isEmpty()) {
                valorRetorno += "{\"id\":-1,\"valor\":\"No hay ubicaciones\"}";
            } else {
                valorRetorno += "";


                for (ubicaciones u : listaUbicaciones) {
                    valorRetorno += u.toString() + ",";
                }

                valorRetorno = valorRetorno.substring(0, valorRetorno.length() - 1);

            }
        } catch (Exception e) {
            valorRetorno += "{\"id\":-1,\"valor\":\"Ha ocurrido un error: " + e.getLocalizedMessage() + "\"}";
        }
        valorRetorno += "]}";
        return valorRetorno;
    }

    String registrarUbicacion(String usuario, String idUbicacion) {
        String valorRetorno = "{\"valores\":";

        valorRetorno += "\"" + operacionesBD.registrarUbicacion(usuario, idUbicacion) + "\"}";


        return valorRetorno;
    }

    String reporteVigilanciaSinImagen(String involucrados, String lugar, String sector, String evento, String observaciones, String guarda) {

        try {
          
            Gson gson = new Gson();
            String valorRetorno = "{\"valores\":\"";
            listaImplicados lista = gson.fromJson(involucrados, listaImplicados.class);
            emailer emailer = new emailer();
            String[] resultado = emailer.sendEmail(lista.implicados, lugar, sector, getNombreEvento(evento), observaciones, guarda);

            if (resultado[0].equalsIgnoreCase("true")) {


                // Si se mando el email, se guarda en la Base de datos
                valorRetorno += operacionesBD.reporteVigilancia(involucrados, lugar, sector, evento, observaciones, guarda) + "\"}";

                
            } else {
                valorRetorno += resultado[1] + "\"}";

            }

            return valorRetorno;

        } catch (Exception e) {


            return "{\"Error:\":\"" + e.getLocalizedMessage() + "\"}";
        }



    }
    String reporteVigilanciaConImagen(String involucrados, String lugar, String sector, String evento, String observaciones, String guarda,byte[]imagen) {

        try {
              java.util.Date utilDate = new java.util.Date(); 
  long lnMilisegundos = utilDate.getTime();
  java.sql.Date sqlDate = new java.sql.Date(lnMilisegundos);
  java.sql.Time sqlTime = new java.sql.Time(lnMilisegundos);
  
  
  System.out.println("sql.Date: "+sqlDate);
  System.out.println("sql.Time: "+sqlTime);
  
  String formato="jpg";
  
  //Esta carpeta tiene que estar creada!!!
  String rutaImagen="c:/imagenes/"+guarda+"-"+sqlDate.toString()+"-"+sqlTime.toString()+"."+formato;
        InputStream in = new ByteArrayInputStream(imagen);
	BufferedImage bImageFromConvert = ImageIO.read(in);
 
		ImageIO.write(bImageFromConvert, formato, new File(
					rutaImagen));
            
            
            
            
            
            Gson gson = new Gson();
            String valorRetorno = "{\"valores\":\"";
            listaImplicados lista = gson.fromJson(involucrados, listaImplicados.class);
            emailer emailer = new emailer();
            String[] resultado = emailer.sendEmail(lista.implicados, lugar, sector, getNombreEvento(evento), observaciones, guarda);

            if (resultado[0].equalsIgnoreCase("true")) {


                // Si se mando el email, se guarda en la Base de datos
                valorRetorno += operacionesBD.reporteVigilancia(involucrados, lugar, sector, evento, observaciones, guarda,rutaImagen) + "\"}";

                
            } else {
                valorRetorno += resultado[1] + "\"}";

            }

            return valorRetorno;

        } catch (Exception e) {


            return "{\"Error:\":\"" + e.getLocalizedMessage() + "\"}";
        }



    }

    String getNombreEvento(String idEvento) {
        int id = Integer.parseInt(idEvento);
        String retorno = "";

        if (listaEventos == null) {
            this.obtenerEventos();
        }

        for (eventos e : listaEventos) {
            if (e.getIdEvento() == id) {
                retorno = e.getEvento();
            }

        }

        return retorno;
    }

    String posicionesGuardas() {
         
        try {
           
           String valorRetorno="{\"valores\":";
         ArrayList<ubicacionGuarda>listaGuardas=operacionesBD.posicionesGuardas();
         
         if(listaGuardas.isEmpty())
                valorRetorno+="\"No hay posiciones registradas\"";
             
         else {
             
             
             Gson gson = new Gson();
             Collection<ubicacionGuarda> coleccion = listaGuardas;
                valorRetorno += gson.toJson(coleccion);
                         
         }
        valorRetorno+="}";
         return valorRetorno;
         
        }
        
        catch (Exception e){
        
        return "{\"Error\":\""+e.getLocalizedMessage()+"\"}";
        }
           
    }

    String agregarUbicacion(String latitud1, String latitud2, String longitud1, String longitud2, String nombre) {
        
        String valorRetorno = "{\"valores\":";

        valorRetorno += "\"" + operacionesBD.agregarUbicacion(latitud1,latitud2,longitud1,longitud2,nombre) + "\"}";


        return valorRetorno;  
        
    }

    String informe(String guarda) {
        
        try {
            String valorRetorno="{\"valores\":";
            ArrayList<informeReportes>reportes=operacionesBD.informeReportes(guarda);
            ArrayList<informeCheckins>checks=operacionesBD.informeCheckins(guarda);
            informeGuarda informe=new informeGuarda(reportes, checks);
            Gson gson = new Gson();
            valorRetorno+=gson.toJson(informe);
            
        return valorRetorno;
        
        } 
        
        
        
        catch (Exception e) {
        return "{\"Error\":\""+e.getLocalizedMessage()+"\"}";
        }
        
        
        
    }

    String listaGuardas() {
         try {
           
           String valorRetorno="{\"valores\":";
         ArrayList<guarda>listaGuardas=operacionesBD.listaGuardas();
         
         if(listaGuardas.isEmpty())
                valorRetorno+="\"No hay guardas registrados\"";
             
         else {
             
             
             Gson gson = new Gson();
             Collection<guarda> coleccion = listaGuardas;
                valorRetorno += gson.toJson(coleccion);
                         
         }
        valorRetorno+="}";
         return valorRetorno;
         
        }
        
        catch (Exception e){
        
        return "{\"Error\":\""+e.getLocalizedMessage()+"\"}";
        }
    }

    String informeReportes(String guarda) {
          try {
           
           String valorRetorno="{\"valores\":";
         ArrayList<informeReportes>listaReportes=operacionesBD.informeReportes(guarda);
         
         if(listaReportes.isEmpty())
                valorRetorno+="\"No hay reportes registrados\"";
             
         else {
             
             
             Gson gson = new Gson();
             Collection<informeReportes> coleccion = listaReportes;
                valorRetorno += gson.toJson(coleccion);
                         
         }
        valorRetorno+="}";
         return valorRetorno;
         
        }
        
        catch (Exception e){
        
        return "{\"Error\":\""+e.getLocalizedMessage()+"\"}";
        }
    }

    String informeCheckins(String guarda) {
          try {
           
           String valorRetorno="{\"valores\":";
         ArrayList<informeCheckins>listaCheckins=operacionesBD.informeCheckins(guarda);
         
         if(listaCheckins.isEmpty())
                valorRetorno+="\"No hay registros.\"";
             
         else {
             
             
             Gson gson = new Gson();
             Collection<informeCheckins> coleccion = listaCheckins;
                valorRetorno += gson.toJson(coleccion);
                         
         }
        valorRetorno+="}";
         return valorRetorno;
         
        }
        
        catch (Exception e){
        
        return "{\"Error\":\""+e.getLocalizedMessage()+"\"}";
        }
    }
}